package com.zhongge.linkedqueue;

/**
 * @ClassName MyQueue
 * @Description TODO 实现自定义链表
 * @Author 笨忠
 * @Date 2025/8/24 19:33
 * @Version 1.0
 */
@SuppressWarnings("all")
public class MyQueue {
    //节点内部类
    static class ListNode{
        //数值域
        public int val;
        //前驱域
        public ListNode prev;
        //后继域
        public ListNode next;

        //构造函数
        public ListNode(int val) {
            this.val = val;
        }
    }

    //首节点
    private ListNode head;
    //尾节点
    private ListNode last;
    //元素个数
    private int usedSize;

    //各种方法

    /**
     * 入队（尾插法）
     * @param val 待入的值
     */
    public void offer(int val) {
        //1.首先得有节点
        ListNode node = new ListNode(val);
        //2.判空
        if (head == null) {
            head = node;
            last = node;
        } else {
            //3.不空就尾插
            //先绑后
            last.next = node;
            node.prev = last;
            //尾变新
            last = node;
        }
        //入队成功需要将usedSize ++
        usedSize++;
    }

    /**
     * 出队(头删)
     * @return 删除的值
     */
    public int poll(){
        //1.链表为空就没必要删除
        if (this.head == null) {
            return -1;
        }
        //先获取删除元素的值
        int tmp = this.head.val;

        //2.单独节点头删
        if (this.head.next == null) {
            //单独节点头删代码
            this.head = null;
            this.last = null;
        } else {
            //3.非单独节点头删
            //非单独节点头删代码
            //头变新
            head = head.next;
            //新头无前驱
            head.prev = null;
        }
        //出队后元素-1
        this.usedSize--;
        //返回删除节点的值
        return tmp;
    }

    /**
     * 获取队头元素
     * @return head指向的节点的元素值
     */
    public int peek() {
        if (head == null) {
            return -1;
        }
        return head.val;
    }

    /**
     * 获取队列中元素个数
     * @return 元素个数
     */
    public int size() {
        return this.usedSize;
    }

    /**
     * 判断队列是否为空
     * @return true空， false不空
     */
    public boolean isEmpty(){
        return this.usedSize == 0;
    }

}
